// function foo(enable = true) {
// }

// // 参数默认值应该是在没有传递实参的时候设置的值

// // 需要注意的时候如果有多个参数时，带有默认值的参数应该是放在最后的

// // 剩余参数

// function foo2 (...args) {
//     console.log(args, "args");
// }

// foo2(1,2,3)

// // 展开数组

// const arr = [1,2,3]
// console.log.apply(console, arr);
// console.log(...arr, "arr2");

// // 箭头函数

// // 可以节省代码，且不会改变this的指向， this始终会指向当前作用域。

// // 对象字面量的加强

// // 计算属性名 属性名 用[] 包裹里面可以写表达式

// // 对象扩展方法

// // assign 将多个源对象中的属性放到目标对象

// const source = {
//     a:2,
//     b:2,
//     c:3
// }

// const target = {
//     a: 1,
//     b: 2,
//     c: 3
// }

// const result = Object.assign(target, source);
// console.log(result, "result");

// // assign 传入多个参数结果也是一样的

// // 也可以用来复制对象

// const newRes = Object.assign({}, source);

// // is 方法，判断两个值是否相等

// Object.is(+0, -0) // 三等无法判断的 +0 和-0  、NaN 可以用Object.js 方法判断得到


// console.log(Object.is(NaN, NaN))

// // Proxy 为对象设置访问代理器

// const person = {
//     name: 'zce',
//     age: 20
// }

// const personProxy = new Proxy(person, {
//     get(target, property) {
//         // target方法拿到 代理对象， property 拿到键， 取值的时候会触发
//         console.log(target, property)
//         return 100
//     },
//     set(target, property, value) {
//         target[property] = value;
//     }
// })

// console.log(personProxy.name, "name")

// const len = arr.length;
// for (let i<0; i< len; i++) {
//     arr[i] = [];
// }

// const list = [];

// const listProxy = new Proxy(list, {
//     set(target, property, value) {
//         console.log('set', property, value)
//         target[property] = value;
//         return true;
//     }
// })

// listProxy.push(100);

class Person {
    constructor(name) {
        this.name = name
    }

    say() {
        console.log("唱")
    }
}

const p = new Person;

p.say();